{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**问题：**\n",
    "假设你正在为一个电影推荐系统设计一个简单的KNN算法。我们有以下一些用户的电影评分数据，数据由两个特征组成：用户对电影A和电影B的评分，分别在1-5之间。用户的标签（电影类型偏好）是动作片（标签0）或者是喜剧片（标签1）。我们有一个新用户，他给电影A评分为3，电影B评分为4。请问这个用户可能偏好哪种类型的电影？\n",
    "\n",
    "**数据：**\n",
    "\n",
    "| 用户   | 电影A评分 | 电影B评分 | 偏好类型 |\n",
    "| ------ | --------- | --------- | -------- |\n",
    "| 用户1  | 5         | 1         | 动作片   |\n",
    "| 用户2  | 4         | 2         | 动作片   |\n",
    "| 用户3  | 2         | 5         | 喜剧片   |\n",
    "| 用户4  | 1         | 4         | 喜剧片   |\n",
    "| 用户5  | 3         | 2         | 动作片   |\n",
    "| 用户6  | 2         | 5         | 喜剧片   |\n",
    "\n",
    "你需要做以下步骤：\n",
    "1. 构造数据\n",
    "2. 创建KNN模型\n",
    "3. 使用数据训练模型\n",
    "4. 预测新用户的喜好"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 0. 引入核心包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.neighbors import KNeighborsClassifier"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. X, y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = np.array([[5, 1], [4, 2], [2, 5], [1, 4], [3, 2], [2, 5]])\n",
    "\n",
    "y = np.array([0, 0, 1, 1, 0, 1])  # 0表示动作片，1表示喜剧片"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 创建 KNN 模型\n",
    "k = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "knn = KNeighborsClassifier(n_neighbors=1)  # k=1"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-2 {color: black;}#sk-container-id-2 pre{padding: 0;}#sk-container-id-2 div.sk-toggleable {background-color: white;}#sk-container-id-2 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-2 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-2 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-2 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-2 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-2 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-2 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-2 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-2 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-2 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-2 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-2 div.sk-item {position: relative;z-index: 1;}#sk-container-id-2 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-2 div.sk-item::before, #sk-container-id-2 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-2 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-2 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-2 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-2 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-2 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-2 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-2 div.sk-label-container {text-align: center;}#sk-container-id-2 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-2 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KNeighborsClassifier(n_neighbors=1)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" checked><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">KNeighborsClassifier</label><div class=\"sk-toggleable__content\"><pre>KNeighborsClassifier(n_neighbors=1)</pre></div></div></div></div></div>"
      ],
      "text/plain": [
       "KNeighborsClassifier(n_neighbors=1)"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn.fit(X, y)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. 用模型推理(预测)用户的喜好"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "new_user = np.array([[3, 4]])\n",
    "prediction = knn.predict(new_user)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5. 数据可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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l156iZiYGHN72bJlyczMtGpsEREpOh0pErHAz8+PS5cuWVz29ddf8+CDDxIREcGaNWuKva2QkBB8fX3Zt29frvY//vgDLy+vYo8vIiKFo6JIxIImTZpYnAj91VdfERUVRevWrfNcVl9Up06d4sqVK1SvXj1X+759+/K0iYiI/agoErFg0KBBXL16lcOHD5vbli5dyv3330/t2rWZN28ev/zyC7/88gt79+61auzWrVsza9YsNm7cyJw5c2jSpAkAr7zySq5+iYmJdOvWrfjJiIhIoagoErHggQceoGzZskycONHcNmvWLAzD4PDhwzRv3tz8atasmbnPxo0bMZlMvPPOO/mOfebMGZ5//nnuuusunn76acqWLcuaNWto1KiRuc+HH35IVlYWr732ml3yExGRvFQUieRjzJgxfP7551y/fh2A+Ph4DMPI88pZDvDTTz9hMpno27dvvuMmJiaSmZmJYRhkZmaSmJjIPffck6vPK6+8wr333kvFihXtk5yIiOShokgkH5MnTzbfaLGwPvnkE3r27EmdOnWKvN3U1FQaNGjA4sWLizyGiIhYT5fkixRg6dKlVvXfunVrsbfp5+dnk6vaRETEOiqK5LaXlpbGxo0bSUxMxDAMAgMDWb16NXfffbfN73ouIiKll0NPn02ePBmTyZTrFRoaWuA6S5YsITQ0FB8fH5o1a8aKFStKKFpxRSkpKXzyySccOXKErKwsc3tSUhKffvrpLZ9PJiIirsPhc4qaNGlCUlKS+bVx48Z8+27evJno6GiGDRvGzp07iYqKIioqit27d5dgxOJKli9fnu9dow3DYOXKlSUckYiIOIrDiyIPDw+CgoLMr8qVK+fbd9asWfTo0YOxY8fSqFEjpk2bRnh4OO+9914JRiyu4ty5c6SmphbY59q1a7nuVSQiIq7L4XOK9u/fT/Xq1fHx8SEiIoLp06dTq1Yti323bNnC888/n6ute/fuLFu2LN/x09PTSU9PN79PSUkBsp/im5GRUfwEbpAznq3HLS1cLb9Dhw7ledqyCbjj669Jbt6c9DJlADh8+DA1a9Z0QIS252r78Gaunh+4fo7Kz/nZK8eS+MxMhmEYdt9KPlauXElqaioNGzYkKSmJKVOmcOLECXbv3o2/v3+e/l5eXnz00UdER0eb2/71r38xZcqUfOd+TJ48mSlTpuRpj42NxdfX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hVGzZk327t3LH3/8AUC7du1o2LChxSNUImJDN192f+NEzJwjRC+/nPu9iEg+SvVhjMTERPPDVAE6dOhAbGwsEydO5KWXXqJ+/fosW7YsT3FV0ipWrEjHjh3JyMhgxYoVNGrUyOUPi4o4XGHuQ6TCSESsUKqKopufNm3p6dP9+vWjX84N20Tk9pWZWbj7EOUsz8y0f0wi4tRKVVEkIlJot3i4ay46QiQiheDwO1qLiIiIlAYqikRERERQUSQiIiICqCgSERERAVQUiYiIiAAqikREREQAFUUiIiIigIoiEREREUBFkYiIiAigokhEREQEUFEkIiIiAqgoEhEREQFUFImIiIgAKopEREREABVFIiIiIoCKIhERERFARZGIiIgIoKJIREREBFBRJCIiIgKoKBIREREBVBSJiIiIACqKRERERAAVRSIiIiKAiiIRERERQEWRiIiICKCiSERERARQUSQiIiICqCgSERERAcDD2hWef/55i+0mkwkfHx/q1atH3759qVixYrGDExERESkpVhdFO3fuZMeOHWRmZtKwYUMAfv/9d9zd3QkNDeVf//oXL7zwAhs3bqRx48Y2D1hERETEHqw+fda3b1/uvfdeTp48yfbt29m+fTvHjx8nMjKS6OhoTpw4wd13381zzz13y7Fmz55NWFgYAQEBBAQEEBERwcqVK/PtHxMTg8lkyvXy8fGxNgURERGRPKw+UjRjxgzi4uIICAgwt5UrV47JkyfTrVs3Ro0axcsvv0y3bt1uOVbNmjV5/fXXqV+/PoZh8NFHH9G3b1927txJkyZNLK4TEBDAvn37zO9NJpO1KYiIiIjkYXVRlJyczJkzZ/KcGvvjjz9ISUkBoHz58ly7du2WY91333253r/66qvMnj2bH374Id+iyGQyERQUZG3YIiIiIgWyuijq27cvQ4cO5a233qJNmzYAbN26lTFjxhAVFQXATz/9RIMGDawaNzMzkyVLlnD58mUiIiLy7ZeamkpISAhZWVmEh4fz2muv5VtAAaSnp5Oenm5+n1O4ZWRkkJGRYVWMt5Iznq3HLS1cPT9w/RyVn/Nz9RyVn/OzV44l8ZmZDMMwrFkhNTWV5557jn//+99cv34dAA8PDwYPHszMmTMpW7YsCQkJALRo0eKW4+3atYuIiAiuXr2Kn58fsbGx9OrVy2LfLVu2sH//fsLCwkhO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f/45gwcPZt26dTRu3NjqsSyZMGFCrqNLKSkpBAcH061bN5t/qBkZGcTFxREZGYmnp6dNxy4NXD0/cP0clZ/zc/UclZ/zs1eOJfF81UIXRRkZGXh7e5vfe3l55UrWw8OjSM898/Lyol69egC0atWKrVu3MmvWLObMmZOnb1BQUJ4jQqdPnyYoKCjf8b29vXPFncPT09NuX0h7jl0auHp+4Po5Kj/n5+o5Kj/nZ+scS+LzsuoxH7/++iunTp0Csh8A+9tvv5mvPDt79qxNAsrKyso1B+hGERERrF27ltGjR5vb4uLi8p2DJCIiIlJYVhVFXbt25cYpSH/5y18AMJlMGIaByWSyauMTJkygZ8+e1KpVi0uXLhEbG0t8fDyrV68GYNCgQdSoUYPp06cDMGrUKDp16sRbb71F7969Wbx4Mdu2bePDDz+0arsiIiIiNyt0UXT48GGbb/zMmTMMGjSIpKQkypUrR1hYGKtXryYyMhLInsfk5vbnXQM6dOhAbGwsEydO5KWXXqJ+/fosW7Ys19wmERERkaIodFEUEhJi843Pnz+/wOXx8fF52vr160e/fv1sHouIiIjc3vTsMxERERFUFImIiIgAKopEREREABVFIiIiIkARi6Lr16+zZs0a5syZw6VLlwA4efKk+Z5FIiIiIs7GqvsUARw9epQePXqQmJhIeno6kZGR+Pv788Ybb5Cens4HH3xgjzhFRERE7MrqI0WjRo2idevWXLhwgTJlypjb77//ftauXWvT4ERERERKitVHijZs2MDmzZvx8vLK1V67dm1OnDhhs8BERERESpLVR4qysrIsPvj1+PHj+Pv72yQoERERkZJmdVHUrVs33nnnHfN7k8lEamoqkyZNolevXraMTURERKTEWH367K233qJ79+40btyYq1evMmDAAPbv30/lypX55JNP7BGjiIiIiN1ZXRTVrFmTn3/+mcWLF/PLL7+QmprKsGHDGDhwYK6J1yIiIiLOxOqiCMDDw4NHHnnE1rGIiIiIOEyhiqKvv/6anj174unpyddff11g3z59+tgkMBEREZGSVKiiKCoqilOnThEYGEhUVFS+/Uwmk8Ur00RERERKu0IVRVlZWRb/LCIiIuIqrL4k/9ixY/aIQ0RERMShrC6KateuTadOnZg7dy4XLlywR0wiIiIiJc7qomjbtm20bduWqVOnUq1aNaKiovj8889JT0+3R3wiIiIiJcLqoqhly5bMmDGDxMREVq5cSZUqVXjiiSeoWrUqQ4cOtUeMIiIiInZndVGUw2Qy0aVLF+bOncuaNWuoU6cOH330kS1jExERESkxRS6Kjh8/zj/+8Q9atGhB27Zt8fPz4/3337dlbCIiIiIlxuo7Ws+ZM4fY2Fg2bdpEaGgoAwcO5KuvviIkJMQe8YmIiIiUCKuLoldeeYXo6Gjeffddmjdvbo+YREREREqc1UVRYmIiJpPJHrGIiIiIOIzVRZHJZOLixYvMnz+fvXv3AtC4cWOGDRtGuXLlbB6giIiISEko0n2K6taty8yZMzl//jznz59n5syZ1K1blx07dtgjRhERERG7s/pI0XPPPUefPn2YO3cuHh7Zq1+/fp3hw4czevRo1q9fb/MgRUREROzN6qJo27ZtuQoiAA8PD8aNG0fr1q1tGpyIiIhISbH69FlAQACJiYl52o8dO4a/v79NghIREREpaVYXRf3792fYsGF8+umnHDt2jGPHjrF48WKGDx9OdHS0PWIUERERsTuri6I333yTBx54gEGDBlG7dm1q167NkCFDeOihh3jjjTesGmv69Om0adMGf39/AgMDiYqKYt++fQWuExMTg8lkyvXy8fGxNg0RERGRXKyeU+Tl5cWsWbOYPn06Bw8eBKBu3br4+vpavfF169YxYsQI2rRpw/Xr13nppZfo1q0bv/76K2XLls13vYCAgFzFk+6bJCIiIsVldVGUw9fXl2bNmhVr46tWrcr1PiYmhsDAQLZv387dd9+d73omk4mgoKBibVtERETkRoUuioYOHVqofgsWLChyMMnJyQBUrFixwH6pqamEhISQlZVFeHg4r732Gk2aNLHYNz09nfT0dPP7lJQUADIyMsjIyChyrJbkjGfrcUsLV88PXD9H5ef8XD1H5ef87JVjSXxmJsMwjMJ0dHNzIyQkhJYtW1LQKkuXLi1SIFlZWfTp04eLFy+ycePGfPtt2bKF/fv3ExYWRnJyMm+++Sbr169nz5491KxZM0//yZMnM2XKlDztsbGxRTrlJyIiIiUvLS2NAQMGkJycTEBAgF22UeiiaMSIEXzyySeEhITw2GOP8cgjj9zyiI41nnrqKVauXMnGjRstFjf5ycjIoFGjRkRHRzNt2rQ8yy0dKQoODubs2bM2/1AzMjKIi4sjMjIST09Pm45dGrh6fuD6OSo/5+fqOSo/52evHFNSUqhcubJdi6JCnz57//33efvtt/nyyy9ZsGABEyZMoHfv3gwbNoxu3boVa7LzyJEjWb58OevXr7eqIALw9PSkZcuWHDhwwOJyb29vvL29La5nry+kPccuDVw9P3D9HJWf83P1HJWf87N1jiXxeVl1Sb63tzfR0dHExcXx66+/0qRJE55++mlq165Namqq1Rs3DIORI0eydOlSvvvuO+rUqWP1GJmZmezatYtq1apZva6IiIhIjiJffebm5obJZMIwDDIzM4s0xogRI4iNjeWrr77C39+fU6dOAVCuXDnKlCkDwKBBg6hRowbTp08HYOrUqbRv35569epx8eJFZsyYwdGjRxk+fHhRUxERERGx7khReno6n3zyCZGRkTRo0IBdu3bx3nvvkZiYiJ+fn9Ubnz17NsnJyXTu3Jlq1aqZX59++qm5T2JiIklJSeb3Fy5c4PHHH6dRo0b06tWLlJQUNm/eTOPGja3evoiIiEiOQh8pevrpp1m8eDHBwcEMHTqUTz75hMqVKxdr44WZ4x0fH5/r/cyZM5k5c2axtisiIiJys0IXRR988AG1atXijjvuYN26daxbt85ivy+//NJmwYmIiIiUlEIXRYMGDdLjNERERMRlFbooiomJsWMYIiIiIo5l1URrEREREVelokhEREQEFUUiIiIigIoiEREREUBFkYiIiAigokhEREQEUFEkIiIiAqgoEhEREQFUFImIiIgAKopEREREABVFIiIiIoCKIhERERFARZGIiIgIoKJIRFzUuXPnCAwM5MiRIyW63WvXrlG7dm22bdtWott1RdqHUtJUFImIS3r11Vfp27cvtWvXBrL/gu3RowfVq1fH29ub4OBgRo4cSUpKilXjTp8+nTZt2uDv709gYCBRUVHs27fPvNzLy4sxY8bw4osv2jKd29LN+/BG586do2bNmphMJi5evGjVuNqHkh8VRSLictLS0pg/fz7Dhg0zt7m5udG3b1++/vprfv/9d2JiYlizZg1PPvmkVWOvW7eOESNG8MMPPxAXF0dGRgbdunXj8uXL5j4DBw5k48aN7Nmzx2Y53W4s7cMbDRs2jLCwsCKNrX0o+VFRJCIuZ+XKlXh7e9O+fXtzW4UKFXjqqado3bo1ISEhdO3alaeffpoNGzZYNfaqVasY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GjVqMH36dABGjRpFp06deOutt+jduzeLFy9m27ZtfPjhhw7LQ0Qcx6NWLQK/W8uVZV9xaeVKAMrcfz/lov8PrxYtHBucFEqZyHsJ2ryRy4tiufy/Gzb6PflXykVH/1nwipQAhx4pKsyTihMTE0lKSjK/79ChA7GxsXz44Yc0b96czz//nGXLltG0aVNHpCAipYCbry9lB0RTaUH2jf7KvzJNBZGTca9WjYAxL1B50X8A8H/2GRVEUuIceqSoMBe+xcfH52nr168f/fr1s0NEIiIicrvSs89EREREUFEkIiIiAqgoEhEREQFUFImIiIgAKopEREREABVFIiIiIoCKIhERERFARZGIiIgIoKJIREREBFBRJCIiIgKoKBIREREBVBSJiIiIACqKRERERAAVRSIiIiKAiiIRERERQEWRiIiICKCiSERERARQUSQiIiICqCgSERERAVQUiYiIiAAqikREREQAFUUiIiIigIoiEREREUBFkYiIiAigokhEREQEUFEkIiIiAqgoEhEREQFUFImIiIgAKopEREREABVFIiIiIoCKIhERERHAwUXR+vXrue+++6hevTomk4lly5YV2D8+Ph6TyZTnderUqZIJWERERFyWQ4uiy5cv07x5c95//32r1tu3bx9JSUnmV2BgoJ0iFBERkduFhyM33rNnT3r27Gn1eoGBgZQvX972AYmIiMhty6FFUVG1aNGC9PR0mjZtyuTJk+nYsWO+fdPT00lPTze/T0lJASAjI4OMjAybxpUznq3HLS1cPT9w/RyVn/Nz9RyVn/OzV44l8ZmZDMMw7L6VQjCZTCxdupSoqKh8++zbt4/4+Hhat25Neno68+bN4+OPP+bHH38kPDzc4jqTJ09mypQpedpjY2Px9fW1VfgiIiJiR2lpaQwYMIDk5GQCAgLssg2nKoos6dSpE7Vq1eLjjz+2uNzSkaLg4GDOnj1r8w81IyODuLg4IiMj8fT0tOnYpYGr5weun6Pyc36unqPyc372yjElJYXKlSvbtShyytNnN2rbti0bN27Md7m3tzfe3t552j09Pe32hbTn2KWBq+cHrp+j8nN+rp6j8nN+ts6xJD4vp79PUUJCAtWqVXN0GCIiIuLkHHqkKDU1lQMHDpjfHz58mISEBCpWrEitWrWYMGECJ06c4N///jcA77zzDnXq1KFJkyZcvXqVefPm8d133/Htt986KgURERFxEQ4tirZt20aXLl3M759//nkABg8eTExMDElJSSQmJpqXX7t2jRdeeIETJ07g6+tLWFgYa9asyTWGiIiISFE4tCjq3LkzBc3zjomJyfV+3LhxjBs3zs5RiYiIyO3I6ecUiYiIiNiCiiIRERERVBSJiIiIACqKRERERAAVRSIiIiKAiiIRERERQEWRiIiICKCiSERERARQUSQiIiICqCgSERERAVQUiYiIiAAqikREREQAFUUiIiIigIoiEREREUBFkYiIiAigokhEREQEUFEkIiIidnLu3DkCAwM5cuRIiW+7ffv2fPHFF1ato6JIRERE7OLVV1+lb9++1K5d29xmMpnyvBYvXmzVuOvXr+e+++6jevXqmEwmli1blqfPxIkTGT9+PFlZWYUeV0WRiIiI2FxaWhrz589n2LBheZYtXLiQpKQk8ysqKsqqsS9fvkzz5s15//338+3Ts2dPLl26xMqVKws9rodVUYiIiIgUwsqVK/H29qZ9+/Z5lpUvX56goKAij92zZ0969uxZYB93d3d69erF4sWL6d27d6HG1ZEiERERsblNmzbRqlUri8tGjBhB5cqVadu2LQsWLMAwDLvE0LZtWzZs2FDo/jpSJCIiIjZ39OhRqlevnqd96tSp3HPPPfj6+vLtt9/y9NNPk5qayrPPPmvzGKpXr86xY8fIysrCze3Wx4FUFImIiIjNXb16FR8fnzztf//7381/btmyJZcvX2bGjBl2KYrKlClDVlYW6enplClT5pb9dfpMREREbK5SpUpcuHDhlv3atWvH8ePHSU9Pt3kM58+fp2zZsoUqiEBFkYiIiNhBixYt+PXXX2/ZLyEhgQoVKuDt7W3zGHbv3k3Lli0L3V+nz0RERMTmIiMjmThxIhcuXKBChQoA/Pe//+X06dO0b98eHx8f4uLieO211xgzZoxVY6empnLgwAHz+8OHD5OQkEDFihWpVauWuX3Dhg1069at0OPqSJGIiIjYXLNmzQgPD+ezzz4zt3l6evL+++8TERFBixYtmDNnDm+//TaTJk0y9zly5Agmk4n4+Ph8x962bRstW7Y0HwV6/vnnadmyJS+//LK5z4kTJ9i8eTOPPfZYoWPWkSIRERGxi5dffpmxY8fy+OOP4+bmRo8ePejRo0eB6xw+fJjy5cvTvHnzfPt07tz5lpfx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DLZu3Urjxo3NbQMGDGD37t1s376dzz//nIEDB+a7zfDwcPbv309gYCD16tXL9SpXrpzFdRYtWkTNmjX5+eefSUhIML/eeustYmJiyMzMtCrvTZs28eyzz9KrVy+aNGmCt7c3Z8+ezdXH09PT6nFv1rBhQ65fv87OnTvNbQcOHODChQvFGldEik5FkYhY5O7uzt69e/n1119znQLKUbZsWZ566inGjh3LqlWr+PXXX3n88cdJS0tj2LBh5n61a9emQ4cODBs2jMzMTPr06ZPvNgcOHEjlypXp27cvGzZs4PDhw8THx/Pss89y/Phxi+vMnz+fhx56iKZNm+Z6DRs2jLNnz7Jq1Sqr8q5fvz4ff/wxe/fu5ccff2TgwIGUKVMmV5/atWuzdu1aTp06VeQiJjQ0lHvvvZcnnniCn376iZ07d/LEE09YPHolIiVDRZGI5CsgIICAgIB8l7/++us8+OCDPProo4SHh3PgwAFWr16dZ17MwIED+fnnn7n//vvzFBg38vX1Zf369dSqVYsHHniARo0aMWzYMK5evWoxju3bt/Pzzz/z4IMP5llWrlw5unbtyvz5863IOLvIunDhAuHh4Tz66KPmWw7c6K233iIuLo7g4OA8tymwxr///W+qVq3K3Xffzf3338/jjz+Ov78/Pj4+RR5TRIrOZBiG4eggREQEjh8/TnBwMGvWrKFr166ODkfktqOiSETEQb777jtSU1Np1qwZSUlJjBs3jhMnTvD777/nmaQtIvanq89ERBwkIyODl156iUOHDuHv70+HDh1YtGiRCiIRB9GRIhERERE00VpEREQEUFEkIiIiAqgoEhEREQFUFImIiIgAKopEREREABVFIiIiIoCKIhERERFARZGIiIgIoKJIREREBID/B8SaUPgBdxGHAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "plt.title(\"User Movie Preference\", size=15)\n",
    "plt.xlabel(\"Movie A rating\")\n",
    "plt.ylabel(\"Movie B rating\")\n",
    "plt.grid()\n",
    "\n",
    "# 绘制原始样本点，要求不同的影片喜好类别用不同的颜色标记\n",
    "plt.scatter(X[:, 0], X[:, 1], c=y, cmap='Set1')\n",
    "\n",
    "# 绘制新数据点，用红色x标记，大小为8\n",
    "plt.plot(new_user[0, 0], new_user[0, 1], 'rx', markersize=8)\n",
    "\n",
    "# 新数据最近邻索引为第一个最近邻的索引\n",
    "dist, idx = knn.kneighbors(new_user)\n",
    "nearest = X[idx.ravel()]  # 获取最近邻点的坐标，这是一个列表，第一个元素是x坐标，第二个元素是y坐标\n",
    "\n",
    "# 用红线标记新数据点与最近邻点的连接线\n",
    "plt.plot([new_user[0, 0], nearest[0,0]], [new_user[0, 1], nearest[0,1]], 'r--',)\n",
    "\n",
    "# 为每个点添加坐标文本\n",
    "for x, y in zip(X[:, 0], X[:, 1]):\n",
    "    plt.text(x, y+0.1, f'({x}, {y})')\n",
    "\n",
    "# 为新数据点添加坐标文本\n",
    "plt.text(new_user[0,0], new_user[0,1]+0.1, f'({new_user[0,0]}, {new_user[0,1]})')\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.11"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
